package erlangToJsPackage;
//http://pdincau.wordpress.com/2010/01/07/how-to-create-a-java-erlang-node-with-jinterface/#comments


import java.io.IOException;
import java.util.ArrayList;

import structurePackage.Donnee;
import structurePackage.Noeud;

import com.ericsson.otp.erlang.*;

public class ErlangListener{
	/*
	 * Client erlang a lancer avec : erl -sname client
	 * Testé sur le jalon1 : 
	 * c(ring).
	 * ring:test().
	 * ring:parcourir(bob).
	 * Pour représenter le ring, on va recevoir des parametres de type :
	 *  {server,'server@chris-samsung'} ! {self(),[{bob,[{cle,a},{cle,b}]}, {anna,[{cle,c},{cle,d}]}] }.
	 */


	public static void ecouterErlangEtGenererNoeuds(){
		ArrayList<Noeud> res=new ArrayList<Noeud>();
		OtpNode myNode=null;
		try {
			myNode = new OtpNode("server");
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		OtpMbox myMbox = myNode.createMbox("server");
		OtpErlangObject myObject=null;
		OtpErlangTuple myMsg; //id et mot
		OtpErlangList liste;
		while(true){
			try	{
				try {
					System.out.println("En attente de message");
					
					myObject = myMbox.receive();
					System.out.println("/**     MESSAGE RECUS              **/");
					
				} catch (OtpErlangDecodeException e) {
					e.printStackTrace();
				}
				myMsg = (OtpErlangTuple) myObject;
				liste = (OtpErlangList) myMsg.elementAt(1); // contient :  [{bob,[{cle,a},{cle,b}]},{anna,[{cle,c},{cle,d}]}]
				for(OtpErlangObject noeud : liste){ //pour chacun des noeuds dans le message recus

					OtpErlangTuple noeudEtDonnees = (OtpErlangTuple) noeud;
					OtpErlangAtom nom_noeud=(OtpErlangAtom) noeudEtDonnees.elementAt(0); //contient "bob"
					OtpErlangList liste_des_donnees=(OtpErlangList) noeudEtDonnees.elementAt(1);
					//System.out.println("liste_des_donnees : "+liste_des_donnees);
					
					ArrayList<Donnee> donnees=new ArrayList<Donnee>();
					for(OtpErlangObject donnee : liste_des_donnees){
						OtpErlangTuple tuple_donnee = (OtpErlangTuple) donnee;
						donnees.add(new Donnee(tuple_donnee.elementAt(0).toString(),tuple_donnee.elementAt(1).toString()));
					}
					
					ArrayList<String> fingers=new ArrayList<String>();
					try{
						OtpErlangList liste_des_fingers=(OtpErlangList) noeudEtDonnees.elementAt(2);
						for(OtpErlangObject finger : liste_des_fingers){
							OtpErlangAtom fingerAtom = (OtpErlangAtom)finger;
							fingers.add(fingerAtom.toString());
						}
					}catch(Exception e){}
					
					
					//Instanciation du noeud et ajout dans la liste resultat
					Noeud n=new Noeud(nom_noeud.toString(), donnees,fingers);
					//OtpErlangAtom atom =(OtpErlangAtom) object;
					//System.out.println("Atom recus : "+atom);
					res.add(n);
				}
				Generator g=new Generator(res);
				g.afficher();
				res.clear();
				//
				//{servern,server@PC} ! [caca,toto]; tableau
			} catch(OtpErlangExit e){
				e.printStackTrace();
				break;
			}
		}
	}

	/**
	 * Méthode permettant de visualiser les messages envoyé par l'erlang
	 * @throws Exception
	 */
	private static void afficherDetailDeMessage(OtpErlangObject myObject) throws Exception{
		System.out.println("/* Détail  du message : */");
		OtpErlangTuple myMsg; //id et mot
		OtpErlangPid from;
		OtpErlangList liste;
		myMsg = (OtpErlangTuple) myObject;
		//System.out.println("Tuple recu :"+myMsg);
		from = (OtpErlangPid) myMsg.elementAt(0); // le pid du processus qui a envoyé le message
		liste = (OtpErlangList) myMsg.elementAt(1); //recupere le parametre 1 de la réponse
		System.out.println("from : "+from);
		System.out.println("command  : "+liste);
		
		int numero_noeud=0;
		for(OtpErlangObject noeud : liste){ 
			System.out.println("	Noeud n°"+numero_noeud);
			//{server,'server@chris-samsung'} ! {self(),[{bob,[{cle,a},{cle,b}]}] }. 
			OtpErlangTuple noeudEtDonnees = (OtpErlangTuple) noeud;
			//System.out.println("		noeudEtDonnees  : "+noeudEtDonnees);
			OtpErlangAtom nom_noeud=(OtpErlangAtom) noeudEtDonnees.elementAt(0);
			System.out.println("		noeud : "+nom_noeud);
			OtpErlangList liste_des_donnees=(OtpErlangList) noeudEtDonnees.elementAt(1);
			System.out.println("liste_des_donnees : "+liste_des_donnees);
			int numero_donnee=0;
			for(OtpErlangObject donnee : liste_des_donnees){
				System.out.println("		donnée n°"+numero_donnee);
				OtpErlangTuple tuple_donnee = (OtpErlangTuple) donnee;
				//System.out.println(" Tuple donnee : "+tuple_donnee);
				System.out.println("			cle : "+tuple_donnee.elementAt(0));
				System.out.println("			donnee : "+tuple_donnee.elementAt(1));
				numero_donnee++;
			}
			numero_noeud++;
			//System.out.println("Atom recus : "+atom);

		}
		System.out.println("");
	}
}
